﻿//引用的概念和定义
#include<iostream>
using namespace std;
int main()
{
	int a = 0;
	// 引⽤：b和c是a的别名
	int& b = a;
	int& c = a;
	// 也可以给别名b取别名，d相当于还是a的别名
	int& d = b;

	// 这⾥取地址我们看到是⼀样的
	cout << &a << endl;
	cout << &b << endl;
	cout << &c << endl;
	cout << &d << endl;

	++a;//只是对a进行自增操作，通过调试却发现a、b、c和d都自增1
	return 0;
}


//const引用的权限问题
int main()
{
	const int a = 10;
	int b = 20;

	// 这⾥的引⽤是对a和b访问权限的平移
	const int& ra = a;
	int& rb1 = b;
	
	// 这⾥的引⽤是对b访问权限的缩⼩
	const int& rb2 = b;
	return 0;
}


//引用的使用（引用传参）
#include<iostream>
using namespace std;
void Swap(int& rx, int& ry)
{
	int tmp = rx;
	rx = ry;
	ry = tmp;
}

int main()
{
	int x = 0, y = 1;
	cout << x << ' ' << y << endl;
	Swap(x, y);
	cout << x << ' ' << y << endl;
	return 0;
}


//引用的使用（引用做返回值）
#include <stdlib.h>
struct Zh
{
	int top;
	int* arr;
};

int& test(struct Zh& ra)
{
	return ra.arr[ra.top - 1];
}

int main()
{
	struct Zh a;
	a.top = 0;
	a.arr = (int*)malloc(10 * 4);
	for (; a.top < 5; a.top++)
	{
		a.arr[a.top] = a.top;
	}
	test(a)++;
	return 0;
}


//引用的底层原理
int main()
{
	int a = 5;
	int& ra = a;

	int b = 10;
	int* pb = &b;
	return 0;
}